package cn.cdutetc.library.service;

import cn.cdutetc.library.entity.dto.NotificationDTO;
import cn.cdutetc.library.entity.dto.NotificationVO;
import cn.cdutetc.library.entity.pojo.Notification;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * 通知服务接口
 */
public interface NotificationService extends IService<Notification> {

    /**
     * 创建通知
     * @param notificationDTO 通知DTO
     * @return 通知ID
     */
    Integer createNotification(NotificationDTO notificationDTO);

    /**
     * 创建系统通知（发送给所有用户）
     * @param notificationDTO 通知DTO
     * @return 是否成功
     */
    boolean createSystemNotification(NotificationDTO notificationDTO);

    /**
     * 标记通知为已读
     * @param notificationId 通知ID
     * @return 是否成功
     */
    boolean markAsRead(Integer notificationId);

    /**
     * 批量标记通知为已读
     * @param notificationIds 通知ID列表
     * @return 是否成功
     */
    boolean batchMarkAsRead(List<Integer> notificationIds);

    /**
     * 标记用户所有通知为已读
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean markAllAsRead(Integer userId);

    /**
     * 删除通知
     * @param notificationId 通知ID
     * @return 是否成功
     */
    boolean deleteNotification(Integer notificationId);

    /**
     * 获取通知详情
     * @param notificationId 通知ID
     * @return 通知VO
     */
    NotificationVO getNotificationById(Integer notificationId);

    /**
     * 分页查询用户通知
     * @param page 页码
     * @param size 每页数量
     * @param userId 用户ID
     * @param type 通知类型
     * @param isRead 是否已读
     * @return 分页结果
     */
    IPage<NotificationVO> pageUserNotifications(Integer page, Integer size, Integer userId, Integer type, Boolean isRead);

    /**
     * 获取用户未读通知数量
     * @param userId 用户ID
     * @return 未读通知数量
     */
    Integer countUnreadNotifications(Integer userId);

    /**
     * 创建借阅相关通知
     * @param userId 用户ID
     * @param borrowId 借阅ID
     * @param type 通知类型
     * @param title 通知标题
     * @param content 通知内容
     * @return 通知ID
     */
    Integer createBorrowNotification(Integer userId, Integer borrowId, Integer type, String title, String content);
}